package com.mycode.activity;

import android.annotation.SuppressLint;
import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
import android.view.MotionEvent;
import android.view.View;
import android.widget.Button;

import com.base.tool.log.Tags;
import com.other.dispatchEvent.UtilMotionEvent;


public class ActivityTestTouchEventDispatch extends Activity {
    private static final String TAG = Tags.dispatchActivity;

//    View事件执行流程是：
//            (Activity)dispatchTouchEvent-->(Button)dispatchTouchEvent-->(Button)onTouch-->(Button)onTouchEvent


//    Viewgroup事件执行流程是：

//            (Activity)dispatchTouchEvent-->
//            (LinearLayout)diapatchTouchEvent-->(LinearLayout)onInterceptTouchEvent-->
//            (Button)dispatchTouchEvent-->(Button)onTouch-->(Button)onTouchEvent

    /*    Activity并不是视图类，所以没有onInterceptTouchEvent方法
        onInterceptTouchEvent是ViewGroup类的函数，用于截取触摸事件
        比如常用的布局LinearLayout,RelativeLayout等等都是ViewGroup的子类，所以可以重写onInterceptTouchEvent方法来实现拦截事件
    */

    private static final String MyButtonTAG = Tags.dispatchBtListener;
    //分发Activity|分发Button


    @Override
    protected void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);

        setContentView(R.layout.activity_test_touch_event_dispatch_layout);

        initListener();
    }

    @SuppressLint("ClickableViewAccessibility")
    private void initListener() {
        /*
        分发的目的是为了找到真正要处理本次完整触摸事件的View，这个View会在onTouchuEvent结果返回true。

        View中的onTouchEvent是屏幕事件响应处理函数，
        如果设置对应的Listener的话，这里还会与OnTouch、onClick、onLongClick相关联，具体的执行顺序是：
        onTouch（）——>onTouchEvent（）——>onClick（）——>onLongClick（）
        是否能够顺序执行，取决于每个方法返回值是true还是false。
        */

        Button btn_click = (Button) findViewById(R.id.mybtn1);


        btn_click.setOnTouchListener(new View.OnTouchListener() {
            @Override
            public boolean onTouch(View v, MotionEvent event) {
                switch (event.getAction()) {
                    case MotionEvent.ACTION_DOWN:
                        Log.e(MyButtonTAG, "btn OnTouchListener ACTION_DOWN");
                        break;
                    case MotionEvent.ACTION_MOVE:
                        Log.e(MyButtonTAG, "btn OnTouchListener ACTION_MOVE");
                        break;
                    case MotionEvent.ACTION_UP:
                        Log.e(MyButtonTAG, "btn OnTouchListener ACTION_UP");
                        break;
                }

                boolean result = false;
                Log.e(TAG, "onTouch " + (result ? "不再继续分发" : "事件继续分发") + " " + UtilMotionEvent.show(event));

                return result;


            }
        });


        btn_click.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Log.e(MyButtonTAG, "btn OnClickListener *****");
            }
        });
        btn_click.setOnLongClickListener(new View.OnLongClickListener() {
            @Override
            public boolean onLongClick(View v) {
                {
                    Log.e(MyButtonTAG, "btn OnLongClickListener*****");
                    return false;
                }
            }
        });
    }

    @Override
    public boolean dispatchTouchEvent(MotionEvent event) {
        Log.e(TAG, "====================>" + UtilMotionEvent.show(event));

        Log.e(TAG, "dispatchTouchEvent begin " + UtilMotionEvent.show(event));

        switch (event.getAction()) {
            case MotionEvent.ACTION_DOWN:
                break;
            case MotionEvent.ACTION_MOVE:
                break;
            case MotionEvent.ACTION_UP:
                break;
        }


//        true表示不再继续分发，事件被消费了。返回false则事件继续分发
        boolean result = super.dispatchTouchEvent(event);
        Log.e(TAG, "dispatchTouchEvent end " + (result ? "不再继续分发" : "事件继续分发") + " " + UtilMotionEvent.show(event));

        return result;
    }


    @Override
    public boolean onTouchEvent(MotionEvent event) {
        Log.e(TAG, "onTouchEvent begin " + UtilMotionEvent.show(event));

        switch (event.getAction()) {
            case MotionEvent.ACTION_DOWN:
                break;
            case MotionEvent.ACTION_MOVE:
                break;
            case MotionEvent.ACTION_UP:
                break;
        }
        boolean result = super.onTouchEvent(event);
        Log.e(TAG, "onTouchEvent end " + (result ? "事件已经消费" : "事件没消费") + " " + UtilMotionEvent.show(event));

        return result;
    }


}


